package Java.Lock;

//synchronized关键字实现多线程之间的通信

//第一步  创建资源类，定义属性和操作方法
class Share {
    //初始值
    private int number = 0;

    //+1的方法
    public synchronized void inch() throws InterruptedException {
        // 第二步    判断 干活 通知
        while (number != 0) {   //判断是否是0，如果不是0，等待
            this.wait();  //在哪里睡，就这哪里醒
        }
        //如果是0那就加一
        number++;
        System.out.println(Thread.currentThread().getName() + ": : " + number);
        //通知其他线程
        this.notifyAll();

    }

    //-1的方法
    public synchronized void desr() throws InterruptedException {
        //判断
        while (number != 1) {   //解决虚假唤醒问题，将if判断改成while   （第四步：防止虚假唤醒问题）
            this.wait();   //执行wait时，当前线程等待，其他线程抢资源
        }
        //干活
        number--;
        System.out.println(Thread.currentThread().getName() + ": : " + number);
        //通知其他线程
        this.notifyAll();

    }
}

public class SThreadDemo {
    //第三步 创建多个线程，调用资源类的操作方法
    public static void main(String[] args) {
        Share share = new Share();
        //创建线程
        new Thread(() -> {
            for (int i = 1; i < 10; i++) {
                try {
                    share.inch();  //+1方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "AA").start();

        new Thread(() -> {
            for (int i = 1; i < 10; i++) {
                try {
                    share.desr();   //*1方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "BB").start();

        new Thread(() -> {
            for (int i = 1; i < 10; i++) {
                try {
                    share.inch();  //+1方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "CC").start();

        new Thread(() -> {
            for (int i = 1; i < 10; i++) {
                try {
                    share.desr();   //*1方法
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "DD").start();
    }

}
